home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #import "/LocalApps/Mathematica.app/Library/Mathematica/MathLink/Includes/mathlink.h"
-
- #define DEBUG FALSE
-
- void error(MLINK);
- void read_and_print_expression(MLINK);
- int ReadPacket(MLINK);
-
- void main()
- {
- MLMain();
- }
-
- char * FixTeX(char *instring)
- {
- char *temp,*rtnstring;
-
- temp = (char *) malloc((strlen(instring)+100)*sizeof(char));
-
- strcpy(temp,"ToString[TeXForm[");
- strcat(temp, instring);
- strcat(temp,"]]\n");
-
- MLEvaluate(temp);
-
- while (MLNextPacket(stdlink) != RETURNPKT)
- MLNewPacket(stdlink);
- MLGetNext(stdlink);
- MLGetString(stdlink,&rtnstring);
-
- strcpy(temp,"$$\n");
- strcat(temp,rtnstring);
- strcat(temp,"\n$$\n\\bye\n");
-
- MLPutString(stdlink,temp);
- MLEndPacket(stdlink);
-
- free(temp);
- }
-
- void error( mlp) MLINK mlp;
- {
- fprintf( stderr, "\nerror: %s\n", MLErrorMessage( mlp));
- MLClose( mlp);
- exit( 0);
- } /* error */
-
- void read_and_print_expression( p) MLINK p;
- {
- char *s;
- int n, i, len;
- double r;
- static int indent;
-
- i=MLGetNext(p);
- fprintf(stderr, "Packet type = %d\n",i);
-
- switch (i) {
- case MLTKSYM:
- MLGetSymbol( p, &s);
- fprintf( stderr, "%s ", s);
- break;
- case MLTKSTR:
- MLGetString( p, &s);
- fprintf( stderr, "\"%s\" ", s);
- break;
- case MLTKINT:
- MLGetInteger( p, &n);
- fprintf( stderr, "%d ", n);
- break;
- case MLTKREAL:
- MLGetReal( p, &r);
- fprintf( stderr, "%f ", r);
- break;
- case MLTKFUNC:
- indent += 3;
- fprintf( stderr, "\n %*.*s", indent, indent, "");
- if (MLGetArgCount( p, &len) == 0) {
- error( p);
- }else{
- read_and_print_expression(p);
- fprintf( stderr, "[");
- for (i = 1; i <= len; ++i) {
- read_and_print_expression(p);
- if (i != len) fprintf( stderr, ", ");
- }
- fprintf( stderr, "]");
- }
- indent -= 3;
- break;
- case MLTKERROR:
- default:
- error( p);
- }
- } /* read_and_print_expression */
-
-
- int ReadPacket( mlp) MLINK mlp;
- { int code;
- int len = 1;
-
- switch (code = MLNextPacket(mlp)) {
- case INPUTPKT:
- fprintf( stderr, "<INPUTPKT>");
- break;
- case OUTPUTPKT:
- fprintf( stderr, "<OUTPUTPKT>");
- break;
- case TEXTPKT:
- if (DEBUG) fprintf( stderr, "<TEXTPKT>");
- break;
- case RETURNPKT:
- fprintf( stderr, "Result (expression):");
- break;
- case RETURNTEXTPKT:
- fprintf( stderr, "=");
- break;
- case MESSAGEPKT:
- len = 2;
- fprintf( stderr, "\nMessage packet:");
- break;
- case CALLPKT:
- fprintf( stderr, "<CALLPKT>");
- break;
- case INPUTNAMEPKT:
- fprintf( stderr, "\n");
- break;
- case OUTPUTNAMEPKT:
- if (DEBUG) fprintf( stderr, "<OUTPUTNAMEPKT>");
- break;
- case CONTROLPKT:
- fprintf( stderr, "<CONTROLPKT>");
- break;
- case SYNTAXPKT:
- fprintf( stderr, "<SYNTAXERROR>");
- break;
- default:
- fprintf( stderr, "unknown packet \"%d\"\n", code);
- return 0;
- }
- while (len --) {
- read_and_print_expression( mlp);
- }
- if ((code != INPUTNAMEPKT) && (code != OUTPUTNAMEPKT)) {
- fprintf( stderr, "\n");
- }
- return code;
- } /* ReadPacket */
-
- /*******************************************/
- /* Search for string t in string s */
- /* Return position if found, otherwise -1 */
- /*******************************************/
- int instr(s,t)
- char *s,*t;
- {
- int i,j,k;
-
- for (i=0 ; s[i] && t[0] ; i++)
- {
- for (j=i , k=0 ; t[k] && s[j] == t[k] ; j++ , k++);
- if (!t[k])
- return(i);
- }
- return(-1);
- }
-